import Request from 'luch-request'
import {userStore} from '@/stores/modules/userStore'
import {showLoading, hideLoading, showError, showWarning} from '@/utils/feedback'
const baseURL = process.env.NODE_ENV == 'production' ? 'https://z.bc888.cn/api' : 'https://z.bc888.cn/api'
/**
 * @description: 响应结果常量
 */
export const ResultEnum = {
  SUCCESS: 200,
  EXPIRE: [305, 601, 602, 401],
  ERROR: -1,
  ERRMESSAGE: '请求失败',
  TIMEOUT: 30000,
  TYPE: 'success'
}

const service = new Request()


// 全局配置
service.setConfig((config) => {
  config.timeout = ResultEnum.TIMEOUT
  config.baseURL =  baseURL
  return config
})

// 请求拦截器
service.interceptors.request.use(
  (config) => {
    // 显示 loading（根据 custom.loading 配置）
    if (config.custom?.loading) {
      showLoading('加载中')
    }
    const user = userStore()
    // 自动添加 token（根据实际需求获取 token）
    const token = user.userInfo.token
    if (token && !config.header['token']) {
      config.header['token'] = `${token}`
    }

    return config
  },
  (config) => {
    hideLoading()
    showError('请求错误')
    return Promise.reject(config)
  }
)

// 响应拦截器
service.interceptors.response.use(
  (response) => {
    uni.hideLoading()

    const { data } = response
    

    // 登录失效或 token 异常
    if (ResultEnum.EXPIRE.includes(data.code)) {
      showError(data.message || ResultEnum.ERRMESSAGE)

      // 可选：跳转登录页 或 自动刷新 token
      // uni.redirectTo({ url: '/pages/login/index' })

      return Promise.reject({
        code: data.code,
        message: data.message,
        data
      })
    }

    // 接口返回非成功状态码
    if (data.code && data.code != ResultEnum.SUCCESS) {
      showError(data.message || ResultEnum.ERRMESSAGE)

      return Promise.reject({
        code: data.code,
        message: data.message,
        data
      })
    }

    return data
  },
  (err) => {
    uni.hideLoading()

    let message = '网络连接故障'
    const status = err?.code

    switch (status) {
      case 401:
        message = 'token 失效，请重新登录'
        break
      case 403:
        message = '拒绝访问'
        break
      case 404:
        message = '请求地址错误'
        break
      case 500:
        message = '服务器故障'
        break
      default:
        message = err.errMsg || '网络连接故障'
    }

    showWarning(message)

    return Promise.reject({
      status,
      message,
      response: err
    })
  }
)

// 封装 get 和 post 方法
const http = {
  /**
   * GET 请求
   * @param {string} url 请求地址
   * @param {object} params 请求参数
   * @param {object} config 自定义配置（如 loading、header）
   */
  get(url, params, config = {}) {
    return service.get(url, { params, ...config })
  },

  /**
   * POST 请求
   * @param {string} url 请求地址
   * @param {object} data 请求体数据
   * @param {object} config 自定义配置（如 loading、header）
   */
  post(url, data, config = {}) {
    return service.post(url, data, config)
  }
}

export default http